from django.db import models
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from itsdangerous import TimedJSONWebSignatureSerializer, BadData
from meiduo_mall.utils.BaseModel import BaseModel


# Create your models here.
class User(AbstractUser):
    """自定义用户模型类"""
    # 额外增加 mobile 字段
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')

    email_active = models.BooleanField(default=False, verbose_name='邮箱验证')

    default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True,
                                        on_delete=models.SET_NULL, verbose_name='默认地址')

    # 对当前表进行相关设置:
    class Meta:
        db_table = 'tb_users'
        verbose_name = '用户'
        verbose_name_plural = verbose_name
        # ordering = ['id']

    # 在 str 魔法方法中, 返回用户名称
    def __str__(self):
        return self.username

    # 邮箱验证加密
    def generate_verify_email_url(self):

        # 创建加密对象
        obj = TimedJSONWebSignatureSerializer(settings.SECRET_KEY, expires_in=60*60*24)

        # 加密原数据
        data_dict = {'user_id': self.id, 'email': self.email}

        # 加密
        token = obj.dumps(data_dict).decode()

        verify_url = settings.EMAIL_VERIFY_URL + token

        return verify_url

    # 邮箱验证解密
    @staticmethod
    def check_verify_email_token(token):

        # 创建加密对象
        obj = TimedJSONWebSignatureSerializer(settings.SECRET_KEY, expires_in=60 * 60 * 24)

        try:
            # 解密
            data_dict = obj.loads(token)
        except BadData:
            # 解密失败
            return None
        else:
            # 解密成功
            user_id = data_dict.get('user_id')
            email = data_dict.get('email')

        # 获取对应的用户
        try:
            user = User.objects.get(id=user_id, email=email)
        except User.DoesNotExist:
            return None
        else:
            return user


# 用户地址
# class Address(BaseModel):
#     # 外键 - 指向哪个用户
#     user = models.ForeignKey(User, related_name='addresses', verbose_name='用户', on_delete=models.CASCADE)
#     # 外键 - 用户所在省
#     province = models.ForeignKey('areas.Area', related_name='province_addresses', verbose_name='省', on_delete=models.PROTECT)
#     # 外键 - 用户所在市
#     city = models.ForeignKey('areas.Area', related_name='city_addresses', verbose_name='市', on_delete=models.PROTECT)
#     # 外键 - 用户所在区
#     district = models.ForeignKey('areas.Area', related_name='district_addresses', verbose_name='区', on_delete=models.PROTECT)
#
#     title = models.CharField(max_length=20, verbose_name='地址名称')
#     receiver = models.CharField(max_length=20, verbose_name='收货人')
#     place = models.CharField(max_length=50, verbose_name='地址')
#     mobile = models.CharField(max_length=11, verbose_name='手机')
#
#     tel = models.CharField(max_length=20, null=True, blank=True, default='', name='固定电话')
#     email = models.CharField(max_length=30, null=True, blank=True, default='', name='电子邮箱')
#
#     is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')
#
#     class Meta:
#         db_table = 'tb_address'
#         verbose_name = '用户地址'
#         verbose_name_plural = verbose_name
#         ordering = ['-update_time']


class Address(BaseModel):
    """
    用户地址
    """
    user = models.ForeignKey(User,
                             on_delete=models.CASCADE,
                             related_name='addresses',
                             verbose_name='用户')

    province = models.ForeignKey('areas.Area',
                                 on_delete=models.PROTECT,
                                 related_name='province_addresses',
                                 verbose_name='省')

    city = models.ForeignKey('areas.Area',
                             on_delete=models.PROTECT,
                             related_name='city_addresses',
                             verbose_name='市')

    district = models.ForeignKey('areas.Area',
                                 on_delete=models.PROTECT,
                                 related_name='district_addresses',
                                 verbose_name='区')

    title = models.CharField(max_length=20, verbose_name='地址名称')
    receiver = models.CharField(max_length=20, verbose_name='收货人')
    place = models.CharField(max_length=50, verbose_name='地址')
    mobile = models.CharField(max_length=11, verbose_name='手机')
    tel = models.CharField(max_length=20,
                           null=True,
                           blank=True,
                           default='',
                           verbose_name='固定电话')

    email = models.CharField(max_length=30,
                             null=True,
                             blank=True,
                             default='',
                             verbose_name='电子邮箱')

    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_address'
        verbose_name = '用户地址'
        verbose_name_plural = verbose_name
        ordering = ['-update_time']
